<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <title>创意硬币弹跳Loading</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
    <style>
        * {
            border: 0;
            box-sizing: border-box;
            margin: 0;
            padding: 0;
        }

        :root {
            --hue: 163;
            --hue2: 43;
            --bg: hsl(var(--hue), 90%, 30%);
            --fg: hsl(0, 0%, 100%);
            font-size: calc(20px + (40 - 20) * (100vw - 280px) / (3840 - 280));
        }

        body {
            background-color: var(--bg);
            color: var(--fg);
            display: flex;
            font: 1em/1.5 sans-serif;
            height: 100vh;
            transition: background-color var(--trans-dur), color var(--trans-dur);
        }

        .pl {
            display: flex;
            flex-direction: column;
            justify-content: space-between;
            align-items: center;
            margin: auto;
            width: 9.1em;
            height: 9.1em;
        }

        .pl__coin,
        .pl__coin-flare,
        .pl__coin-inscription,
        .pl__coin-layers,
        .pl__shadow {
            animation-duration: 2s;
            animation-timing-function: cubic-bezier(0.37, 0, 0.63, 1);
            animation-iteration-count: infinite;
        }

        .pl__coin {
            animation-name: bounce;
            position: relative;
            transform: translateY(0.5em);
            z-index: 1;
        }

        .pl__coin-flare,
        .pl__coin-inscription,
        .pl__coin-layer {
            position: absolute;
        }

        .pl__coin-flare {
            animation-name: flare1;
            background-color: white;
            clip-path: polygon(50% 0, 67% 33%, 100% 50%, 67% 67%, 50% 100%, 33% 67%, 0 50%, 33% 33%);
            top: 0;
            left: -0.5em;
            width: 1em;
            height: 1em;
            transform: scale(0);
            z-index: 1;
        }

        .pl__coin-flare:nth-child(2) {
            animation-name: flare2;
            top: -0.5em;
            left: 0;
        }

        .pl__coin-flare:nth-child(3) {
            animation-name: flare3;
            left: 3em;
        }

        .pl__coin-flare:nth-child(4) {
            animation-name: flare4;
            top: -0.5em;
            left: 3.5em;
        }

        .pl__coin-inscription {
            animation-name: inscription-front;
            background-color: hsl(var(--hue2), 90%, 45%);
            box-shadow: 0.1875em 0 0 hsl(var(--hue2), 90%, 40%) inset;
            top: 50%;
            left: 50%;
            width: 0.5em;
            height: 2.5em;
            transform: translate(-50%, -50%) rotateZ(30deg);
        }

        .pl__coin-layer {
            background-color: hsl(var(--hue2), 90%, 50%);
            backface-visibility: hidden;
            border-radius: 50%;
            box-shadow: 0 0 0 0.375em hsl(var(--hue2), 90%, 70%) inset;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
        }

        .pl__coin-layer:first-child {
            transform: translate3d(0, 0, 0.5em);
        }

        .pl__coin-layer:nth-child(2) {
            transform: translate3d(0, 0, 0.49em) rotateY(180deg);
        }

        .pl__coin-layer:nth-child(3) {
            backface-visibility: visible;
            border-radius: 0;
            left: 50%;
            width: 0.98em;
            transform: translateX(-50%) rotateY(90deg);
        }

        .pl__coin-layer:nth-child(4) {
            transform: translate3d(0, 0, -0.49em);
        }

        .pl__coin-layer:last-child {
            transform: translate3d(0, 0, -0.5em) rotateY(180deg);
        }

        .pl__coin-layer:nth-child(n + 2):nth-last-child(n + 2) {
            background-color: hsl(var(--hue2), 90%, 40%);
            box-shadow: none;
        }

        .pl__coin-layer:last-child .pl__coin-inscription {
            animation-name: inscription-back;
            transform: translate(-50%, -50%) rotateZ(-30deg);
        }

        .pl__coin-layers {
            animation-name: roll;
            position: relative;
            width: 4em;
            height: 4em;
            transform: rotateY(-15deg) rotateZ(-30deg);
            transform-style: preserve-3d;
        }

        .pl__shadow {
            animation-name: shadow;
            background-color: hsla(var(--hue), 90%, 10%, 0.3);
            border-radius: 50%;
            width: 4em;
            height: 0.5em;
        }

        @keyframes bounce {

            from,
            50%,
            to {
                animation-timing-function: cubic-bezier(0.33, 0, 0.67, 0);
                transform: translateY(0.5em);
            }

            25%,
            75% {
                animation-timing-function: cubic-bezier(0.33, 1, 0.67, 1);
                transform: translateY(5.1em);
            }
        }

        @keyframes flare1 {

            from,
            75%,
            to {
                animation-timing-function: cubic-bezier(0.33, 0, 0.67, 0);
                transform: scale(0);
            }

            87.5% {
                animation-timing-function: cubic-bezier(0.33, 1, 0.67, 1);
                transform: scale(1);
            }
        }

        @keyframes flare2 {

            from,
            to {
                animation-timing-function: cubic-bezier(0.33, 1, 0.67, 1);
                transform: scale(1);
            }

            12.5%,
            87.5% {
                animation-timing-function: cubic-bezier(0.33, 0, 0.67, 0);
                transform: scale(0);
            }
        }

        @keyframes flare3 {

            from,
            25%,
            50%,
            to {
                animation-timing-function: cubic-bezier(0.33, 0, 0.67, 0);
                transform: scale(0);
            }

            37.5% {
                animation-timing-function: cubic-bezier(0.33, 1, 0.67, 1);
                transform: scale(1);
            }
        }

        @keyframes flare4 {

            from,
            37.5%,
            62.5%,
            to {
                animation-timing-function: cubic-bezier(0.33, 0, 0.67, 0);
                transform: scale(0);
            }

            50% {
                animation-timing-function: cubic-bezier(0.33, 1, 0.67, 1);
                transform: scale(1);
            }
        }

        @keyframes inscription-front {

            from,
            75% {
                animation-timing-function: cubic-bezier(0.12, 0, 0.39, 0);
                box-shadow: 0.1875em 0 0 hsl(var(--hue2), 90%, 40%) inset;
            }

            87.49% {
                animation-timing-function: steps(1);
                box-shadow: 0.875em -0.75em 0 hsl(var(--hue2), 90%, 40%) inset;
            }

            87.5% {
                animation-timing-function: cubic-bezier(0.61, 1, 0.88, 1);
                box-shadow: -0.875em 0.75em 0 hsl(var(--hue2), 90%, 40%) inset;
            }

            to {
                box-shadow: 0.1875em 0 hsl(var(--hue2), 90%, 40%) inset;
            }
        }

        @keyframes inscription-back {

            from,
            75% {
                box-shadow: -1em -0.875em 0 hsl(var(--hue2), 90%, 40%) inset;
            }

            to {
                box-shadow: 1.125em 1em 0 hsl(var(--hue2), 90%, 40%) inset;
            }
        }

        @keyframes roll {

            from,
            75% {
                transform: rotateY(-15deg) rotateZ(-30deg) rotateY(0);
            }

            to {
                transform: rotateY(-15deg) rotateZ(-30deg) rotateY(-1turn);
            }
        }

        @keyframes shadow {

            from,
            50%,
            to {
                animation-timing-function: cubic-bezier(0.33, 0, 0.67, 0);
                background-color: hsla(var(--hue), 90%, 10%, 0.3);
                transform: scale(0.6);
            }

            25%,
            75% {
                animation-timing-function: cubic-bezier(0.33, 1, 0.67, 1);
                background-color: hsla(var(--hue), 90%, 10%, 0.5);
                transform: scale(1);
            }
        }
    </style>
</head>

<body>
    <div class="pl">
        <div class="pl__coin">
            <div class="pl__coin-flare"></div>
            <div class="pl__coin-flare"></div>
            <div class="pl__coin-flare"></div>
            <div class="pl__coin-flare"></div>
            <div class="pl__coin-layers">
                <div class="pl__coin-layer">
                    <div class="pl__coin-inscription"></div>
                </div>
                <div class="pl__coin-layer"></div>
                <div class="pl__coin-layer"></div>
                <div class="pl__coin-layer"></div>
                <div class="pl__coin-layer">
                    <div class="pl__coin-inscription"></div>
                </div>
            </div>
        </div>
        <div class="pl__shadow"></div>
    </div>
</body>

</html>